var read_line = require('readline-sync')
read_line.setDefaultOptions({ prompt: '' })
var read_line = read_line.prompt
let [n, m, k] = read_line().split(' ').map((item) => parseInt(item)) // 读取三个整数
let arrU = read_line().split(' ').map((item) => parseInt(item)) // 路径的一个端点
let arrV = read_line().split(' ').map((item) => parseInt(item)) // 路径的另一个端点
let arrW = read_line().split(' ').map((item) => parseInt(item)) // 路径的花费
class Edge {
  constructor(a, b, w) {
    this.a = a
    this.b = b
    this.w = w
  }
}
let edges = []
for (let i = 0; i < m; i++) {
  let from = arrU[i]
  let to = arrV[i]
  let weight = arrW[i]
  edges[2 * i] = new Edge(from, to, weight) // 第0条边是from-->to
  edges[2 * i + 1] = new Edge(to, from, weight) // 第1条边是to-->from
} // 生成所有的边  i表示第几条边 对应的值是边 起点终点权重
// console.log(edges);
let t = bellManFord(edges)
console.log(t)
function bellManFord (edges) {
  // 传入边数组
  let dist = new Array(n + 1).fill(Infinity) // 一共是1~n 所以是n+1个 每个初始值是infinity
  // let dist = new Array(n + 1).fill(0) // 一共是1~n 所以是n+1个 每个初始值是infinity
  dist[1] = 0 // 起点到起点是0
  while (k) {
    let copy = [...dist] // 拷贝一份当前的dist数组
    for (let i = 0; i < 2 * m; i++) {
      let a = edges[i].a // 起点
      let b = edges[i].b // 终点
      let w = edges[i].w // 权重
      // let max = Math.max(copy[a], w)
      dist[b] = Math.min(copy[a] + w, dist[b]) // 起点到b的最短距离就是 起点到a的最短距离+权重 ,和原来的起点到b的最短距离的最小值
      // dist[b] = Math.min(max, dist[b]) // 起点到b的最短距离就是 起点到a的最短距离+权重 ,和原来的起点到b的最短距离的最小值
    }
    k-- // 步数--
  }
  console.log(dist)
  if (dist[n] === Infinity) {
    // 如果没有到最后一个 就返回-1
    return -1
  } else {
    return dist[n]
  }
}